package arsw.twitter.model;

import java.util.LinkedList;
import java.util.List;

import arsw.twitter.common.Mensaje;

public class Usuario implements Observer<Mensaje>, Subject<Mensaje> {
	private String id;
	private Stack<Mensaje> messages = new LinkedListStack<Mensaje>();
	
	private Usuario(String id) {
		this.id = id;
	}
	
	static public Usuario newInstance(String id) {
		return new Usuario(id);
	}
	
	@Override
	synchronized public void update(Mensaje data) {
		messages.push(data);
	}

	public void send(String text) {
		Mensaje m = Mensaje.newInstance(id, text);
		notifyObservers(m);
	}
	
	public Iterable<Mensaje> getMessages() {
		return messages;
	}
	
	List<Observer<Mensaje>> observers = new LinkedList<Observer<Mensaje>>();  
	
	/* (non-Javadoc)
	 * @see arsw.twitter.model.Subject#registerObserver(arsw.twitter.model.Observer)
	 */
	@Override
	public void registerObserver(Observer<Mensaje> o) {
		if (!observers.contains(o)) {
			observers.add(o);
		} else {
			;
		}
	}
	
	/* (non-Javadoc)
	 * @see arsw.twitter.model.Subject#removeObserver(arsw.twitter.model.Observer)
	 */
	@Override
	public void removeObserver(Observer<Mensaje> o) {
		if (observers.contains(o)) {
			observers.remove(o);
		} else {
			;
		}		
	}
	
	/* (non-Javadoc)
	 * @see arsw.twitter.model.Subject#notifyObservers(arsw.twitter.model.Mensaje)
	 */
	@Override
	public void notifyObservers(Mensaje data) {
		for(Observer<Mensaje> o : observers) {
			o.update(data);
		}
	}

}
